package net.sourceforge.jsocks;

/**
 * Exception thrown by various socks classes to indicate errors with protocol or
 * unsuccessful server responses.
 */
public class SocksException extends java.io.IOException {
	private static final long serialVersionUID = 6141184566248512277L;

	static final String UNASSIGNED_ERROR_MESSAGE = "Unknown error message";

	static final String serverReplyMessage[] = { "Succeeded",
			"General SOCKS server failure",
			"Connection not allowed by ruleset", "Network unreachable",
			"Host unreachable", "Connection refused", "TTL expired",
			"Command not supported", "Address type not supported" };

	static final String localErrorMessage[] = { "SOCKS server not specified",
			"Unable to contact SOCKS server", "IO error",
			"None of Authentication methods are supported",
			"Authentication failed", "General SOCKS fault" };

	String errString;

	public int errCode;
	/**
	 * Construct a SocksException with given error code.
	 * <p>
	 * Tries to look up message which corresponds to this error code.
	 * 
	 * @param errCode
	 *            Error code for this exception.
	 */
	public SocksException(int errCode) {
		this.errCode = errCode;
		if ((errCode >> 16) == 0) {
			// Server reply error message
			errString = errCode <= serverReplyMessage.length ? serverReplyMessage[errCode]
					: UNASSIGNED_ERROR_MESSAGE;
		} else {
			// Local error
			errCode = (errCode >> 16) - 1;
			errString = errCode <= localErrorMessage.length ? localErrorMessage[errCode]
					: UNASSIGNED_ERROR_MESSAGE;
		}
	}

	/**
	 * Constructs a SocksException with given error code and message.
	 * 
	 * @param errCode
	 *            Error code.
	 * @param errString
	 *            Error Message.
	 */
	public SocksException(int errCode, String errString) {
		this.errCode = errCode;
		this.errString = errString;
	}

	/**
	 * Get the error code associated with this exception.
	 * 
	 * @return Error code associated with this exception.
	 */
	public int getErrorCode() {
		return errCode;
	}
	/**
	 * Get human readable representation of this exception.
	 * 
	 * @return String represntation of this exception.
	 */
	@Override
	public String toString() {
		return errString;
	}

}// End of SocksException class

